﻿'Контрол, предназначенный для использования в качестве текстового поля
'с расширенными возможностями на ASP.NET Web-сайтах.
'Лицензия: shareware-trial
'Авторские права: Петровчук Александр Сергеевич 2010 г. E-mail:designariada@rambler.ru.
'Данный вариант базируется на  ~\Help\WYSIWYG.htm (использование элемента iFrame)
#Region "Imports"
Imports System
Imports System.ComponentModel
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.ComponentModel.Design
Imports System.Security.Permissions
Imports System.Web.UI.Design
Imports System.Windows.Forms
Imports System.Web.UI.HtmlControls
Imports System.Windows.Forms.Design
Imports System.Drawing.Design
Imports System.Text

#End Region 'Imports
#Region "Web Resources"
'Сссылки на картинки кнопок форматирования
<Assembly: WebResource("Invoteco.Web.RichTextEditor.bold.gif", "image/gif")> 
<Assembly: WebResource("Invoteco.Web.RichTextEditor.italic.gif", "image/gif")> 
<Assembly: WebResource("Invoteco.Web.RichTextEditor.under.gif", "image/gif")> 
<Assembly: WebResource("Invoteco.Web.RichTextEditor.left.gif", "image/gif")> 
<Assembly: WebResource("Invoteco.Web.RichTextEditor.justifyfull.gif", "image/gif")> 
<Assembly: WebResource("Invoteco.Web.RichTextEditor.right.gif", "image/gif")> 

'Cссылки на картинки кнопок смайлов
<Assembly: WebResource("Invoteco.Web.RichTextEditor.face1.gif", "image/gif")> 
<Assembly: WebResource("Invoteco.Web.RichTextEditor.face2.gif", "image/gif")> 
<Assembly: WebResource("Invoteco.Web.RichTextEditor.face3.gif", "image/gif")> 
<Assembly: WebResource("Invoteco.Web.RichTextEditor.face4.gif", "image/gif")> 
<Assembly: WebResource("Invoteco.Web.RichTextEditor.face5.gif", "image/gif")> 

#End Region 'Web Resources
#Region "RichTextBox"

<Assembly: TagPrefix("Invoteco.Web.RichTextEditor", "Invoteco")> 

<AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal), _
DefaultProperty("CaptionText"), _
DefaultEvent("TextChanged"), _
AspNetHostingPermission(SecurityAction.InheritanceDemand, Level:=AspNetHostingPermissionLevel.Minimal), _
Designer(GetType(Invoteco.Web.RichTextEditor.Design.RichTextBoxDesigner)), _
ToolboxData("<{0}:RichTextBox runat=""server""></{0}:RichTextBox>"), _
Drawing.ToolboxBitmap(GetType(Invoteco.Web.RichTextEditor.RichTextBox))> _
Public Class RichTextBox
    Inherits CompositeControl
    Implements INamingContainer
#Region "Events"
    Public Event TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
#End Region 'Events
#Region "Declaration"
#Region "Внедренные поля"
    ''' <summary>
    ''' 10
    ''' </summary>
    ''' <remarks>10</remarks>
    Private _TopAndBotFrameHeight As Integer = 10 'Высота верхней и нижней рамки
    Private _LeftAndRightFrameWidth As Integer = 10 'Ширина левой и правой сторон рамки
    Private _FormatButtonLineHeight As Integer = 24 'Высота линии с кнопками формата
    Private _FormatOneButtonWidth As Integer = 24 'Ширина ячейки под кнопку формата
    Private _TextBoxLineHeight As Integer = 50 'Высота текстового поля

    Private _SmileButtonLineHeight As Integer = 16 'Высота лини кнопок с кнопками
    Private _SmileOneButtonWidth As Integer = 16 'Ширина ячейки под кнопку смайла

    Private _FrameColor As Drawing.Color = Drawing.Color.Gray  'Цвет рамки

    'Стили курсоров (для кнопок типа Image)
    Private cursortypeover As String = "hand"
    Private cursortypeout As String = ""

#End Region 'Внедренные поля

#End Region 'Declaration

#Region "Properties"
#Region "Overridden Properties"
    ''' <summary>
    ''' Подавление свойства BorderColor
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Browsable(False), _
    Themeable(False)> _
    Public Overrides Property BorderColor() As System.Drawing.Color
        Get
            Return MyBase.BorderColor
        End Get
        Set(ByVal value As System.Drawing.Color)
            MyBase.BorderColor = value
        End Set
    End Property
    ''' <summary>
    ''' Подавление border style
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Browsable(False), _
    Themeable(False)> _
    Public Overrides Property BorderStyle() As System.Web.UI.WebControls.BorderStyle
        Get
            Return MyBase.BorderStyle
        End Get
        Set(ByVal value As System.Web.UI.WebControls.BorderStyle)
            MyBase.BorderStyle = value
        End Set
    End Property
    ''' <summary>
    ''' Подавление свойства BorderWidth
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Browsable(False), _
    Themeable(False)> _
    Public Overrides Property BorderWidth() As System.Web.UI.WebControls.Unit
        Get
            Return MyBase.BorderWidth
        End Get
        Set(ByVal value As System.Web.UI.WebControls.Unit)
            MyBase.BorderWidth = value
        End Set
    End Property
    ''' <summary>
    ''' Подавление свойства BackColor
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Themeable(False), _
    Browsable(False)> _
    Public Overrides Property BackColor() As System.Drawing.Color
        Get
            Return MyBase.BackColor
        End Get
        Set(ByVal value As System.Drawing.Color)
            MyBase.BackColor = value
        End Set
    End Property
    ''' <summary>
    ''' Подавление свойства ForeColor
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Themeable(False), _
    Browsable(False)> _
    Public Overrides Property ForeColor() As System.Drawing.Color
        Get
            Return MyBase.ForeColor
        End Get
        Set(ByVal value As System.Drawing.Color)
            MyBase.ForeColor = value
        End Set
    End Property
    ''' <summary>
    ''' Подавление свойства Height
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Themeable(False), _
    Browsable(False)> _
    Public Overrides Property Height() As System.Web.UI.WebControls.Unit
        Get
            Return MyBase.Height
        End Get
        Set(ByVal value As System.Web.UI.WebControls.Unit)
            MyBase.Height = value
        End Set
    End Property
    ''' <summary>
    ''' Подавление свойства Width
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Themeable(False), _
    Browsable(False)> _
    Public Overrides Property Width() As System.Web.UI.WebControls.Unit
        Get
            Return MyBase.Width
        End Get
        Set(ByVal value As System.Web.UI.WebControls.Unit)
            MyBase.Width = value
        End Set
    End Property

    'Переопределение css class 
    ''' <summary>
    ''' CSS Class, применяемый для Searcher-а
    ''' </summary>
    ''' <value>CSS Class name</value>
    ''' <returns>CSS Class name</returns>
    ''' <remarks></remarks>
    <Themeable(True)> _
    Public Overrides Property CssClass() As String
        Get
            Return MyBase.CssClass
        End Get
        Set(ByVal value As String)
            MyBase.CssClass = value
        End Set
    End Property
    'Переопределение свойства font
    ''' <summary>
    ''' Информация о шрифте, применяемом для Searcher-а
    ''' </summary>
    ''' <value></value>
    ''' <returns>font info</returns>
    ''' <remarks></remarks>
    <Themeable(False), _
    Browsable(False)> _
    Public Overrides ReadOnly Property Font() As System.Web.UI.WebControls.FontInfo
        Get
            Return MyBase.Font
        End Get
    End Property
#End Region 'Overridden Properties
#Region "Custom Properties"

#End Region 'Custom Properties
#End Region 'Properties

#Region "Constructor"
    Sub New()

    End Sub
#End Region 'Constructor
#Region "Private Methods"

#End Region 'Private Methods.
#Region "Protected methods"

    Protected Sub CreateControlHierarhy()
        'Вывод js-скрипта на страницу
        WriteScriptToPage()

        'Контейнерная таблица
        Dim ContainerTable As Table = New Table()
        With ContainerTable
            .BorderWidth = 0
            .CellPadding = 0
            .CellSpacing = 0
            .Width = Unit.Percentage(100)
        End With

        'Контейнерная строка
        Dim ContainerRow As TableRow = New TableRow()
        ContainerTable.Rows.Add(ContainerRow)

        'Контейнерная ячейка
        Dim ContainerCell As TableCell = New TableCell() : ContainerCell.ID = "ContainerCell"
        ContainerRow.Cells.Add(ContainerCell)

        'Контейнерная панель (нужна для организации выбора кнопки по умолчанию)
        Dim ContainerPanel As New Panel()
        With ContainerPanel
            .DefaultButton = ""
        End With
        ContainerCell.Controls.Add(ContainerPanel)

        'Внутренняя Контейнерная таблица
        Dim IntContainerTable As Table = New Table()
        With IntContainerTable
            .BorderWidth = 0
            .CellPadding = 0
            .CellSpacing = 0
            .Width = Unit.Percentage(100)
        End With
        ContainerPanel.Controls.Add(IntContainerTable)

        'Верхняя строка (для верхней линии рамки)
        Dim TopRow As New TableRow()
        IntContainerTable.Rows.Add(TopRow)

        'Левая верхняя ячейка
        Dim LeftTopFrameCell As New TableCell()
        With LeftTopFrameCell
            .Width = Unit.Pixel(10)
            .Height = Unit.Pixel(10)
            .BackColor = Me._FrameColor
        End With
        TopRow.Cells.Add(LeftTopFrameCell)

        'Средняя верхняя ячейка рамки
        Dim MiddleTopFrameCell As New TableCell()
        With MiddleTopFrameCell
            '.Width = Unit.Percentage(100)
            .Height = Unit.Pixel(_TopAndBotFrameHeight)
            .BackColor = Me._FrameColor
        End With
        TopRow.Cells.Add(MiddleTopFrameCell)

        'Правая верхняя ячейка
        Dim RightTopFrameCell As New TableCell()
        With RightTopFrameCell
            .Width = Unit.Pixel(10)
            .Height = Unit.Pixel(10)
            .BackColor = _FrameColor
        End With
        TopRow.Cells.Add(RightTopFrameCell)

        'Строка для линии кнопок формата
        Dim FormatRow As New TableRow()
        IntContainerTable.Rows.Add(FormatRow)

        'Левая ячейка строки кнопок формата
        Dim LeftFormatCell As New TableCell()
        With LeftFormatCell
            .Width = Unit.Pixel(_LeftAndRightFrameWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .BackColor = _FrameColor
        End With
        FormatRow.Cells.Add(LeftFormatCell)


        'Средняя ячейка строки формата (для кнопок)

        Dim MidFormatCell As New TableCell()
        With LeftFormatCell
            '.Width = Unit.Percentage(100)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .HorizontalAlign = HorizontalAlign.Left
        End With
        FormatRow.Cells.Add(MidFormatCell)


        'Вариант кнопки для установки жирного шрифта типа Img 
        Dim boldButton As New Image()
        Dim boldButtonImageName As String = "Invoteco.Web.RichTextEditor.bold.gif"
        With boldButton
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), boldButtonImageName)
            .Attributes.Add("onclick", "setBold()")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(boldButton)


        'Вариант кнопки для установки курсива типа Img
        Dim italicButton As New Image()
        Dim italicButtonImageName As String = "Invoteco.Web.RichTextEditor.italic.gif"

        With italicButton
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), italicButtonImageName)
            .Attributes.Add("onclick", "setItal()")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(italicButton)


        'Вариант кнопки для установки подчеркнутого типа Image
        Dim underLineButton As New Image()
        Dim underLineButtonImageName As String = "Invoteco.Web.RichTextEditor.under.gif"

        With underLineButton
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), underLineButtonImageName)
            .Attributes.Add("onclick", "setUnder()")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(underLineButton)

        'Вариант кнопки для установки позиционирования текста Left типа Image

        Dim leftPosButton As New Image()
        Dim leftPosButtonImageName As String = "Invoteco.Web.RichTextEditor.left.gif"

        With leftPosButton
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), leftPosButtonImageName)
            .Attributes.Add("onclick", "setLeft()")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(leftPosButton)

        'Кнопка полного выравнивания КАК IMAGE
        Dim justifyFullButton As New Image()
        Dim justifyFullButtonImageName As String = "Invoteco.Web.RichTextEditor.justifyfull.gif"

        With justifyFullButton
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), justifyFullButtonImageName)
            .Attributes.Add("onclick", "justifyFull()")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(justifyFullButton)

        'Кнопка выравнивания текста по правому краю как IMAGE
        Dim rightButton As New Image()
        Dim rightButtonImageName As String = "Invoteco.Web.RichTextEditor.right.gif"

        With rightButton
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), rightButtonImageName)
            .Attributes.Add("onclick", "setRight()")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(rightButton)

        'Кнопка кнопка вставки смайла (Smile1) КАК РИСУНОК
        Dim smile1Button As New Image()
        Dim smile1ButtonImageName As String = "Invoteco.Web.RichTextEditor.face1.gif"
        With smile1Button
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), smile1ButtonImageName)
            .Attributes.Add("onclick", "setImage(this.src)")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(smile1Button)

        'Кнопка кнопка вставки смайла (Smile2) КАК РИСУНОК
        Dim smile2Button As New Image()
        Dim smile2ButtonImageName As String = "Invoteco.Web.RichTextEditor.face2.gif"
        With smile2Button
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), smile2ButtonImageName)
            .Attributes.Add("onclick", "setImage(this.src)")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(smile2Button)

        'Кнопка кнопка вставки смайла (Smile3) КАК РИСУНОК
        Dim smile3Button As New Image()
        Dim smile3ButtonImageName As String = "Invoteco.Web.RichTextEditor.face3.gif"
        With smile3Button
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), smile3ButtonImageName)
            .Attributes.Add("onclick", "setImage(this.src)")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(smile3Button)

        'Кнопка кнопка вставки смайла (Smile4) КАК РИСУНОК
        Dim smile4Button As New Image()
        Dim smile4ButtonImageName As String = "Invoteco.Web.RichTextEditor.face4.gif"
        With smile4Button
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), smile4ButtonImageName)
            .Attributes.Add("onclick", "setImage(this.src)")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(smile4Button)


        'Кнопка кнопка вставки смайла (Smile5) КАК РИСУНОК
        Dim smile5Button As New Image()
        Dim smile5ButtonImageName As String = "Invoteco.Web.RichTextEditor.face5.gif"
        With smile5Button
            .Width = Unit.Pixel(_FormatOneButtonWidth)
            .Height = Unit.Pixel(_FormatButtonLineHeight)
            .ImageUrl = Me.Page.ClientScript.GetWebResourceUrl(Me.GetType(), smile5ButtonImageName)
            .Attributes.Add("onclick", "setImage(this.src)")
            .Attributes("onmouseover") = "this.style.cursor='hand';"
            .Attributes("onmouseout") = "this.style.cursor='';"
        End With
        MidFormatCell.Controls.Add(smile5Button)



        'Правая ячейка линии формата
        Dim _RightFormatLineCell As New TableCell()
        With _RightFormatLineCell
            .Height = Unit.Pixel(16)
            .Width = Unit.Pixel(10)
            .BackColor = _FrameColor
        End With
        FormatRow.Cells.Add(_RightFormatLineCell)

        'Строка для текстового поля
        Dim txtRow As New TableRow()
        IntContainerTable.Rows.Add(txtRow)

        'Левая ячейка строки
        Dim LeftTxtCell As New TableCell()
        With LeftTxtCell
            .Height = Unit.Pixel(_TextBoxLineHeight)
            .Width = Unit.Pixel(_LeftAndRightFrameWidth)
            .BackColor = _FrameColor
            .Wrap = True
        End With
        txtRow.Cells.Add(LeftTxtCell)

        'Ячейка для текстового поля
        Dim txtCell As New TableCell()
        With txtCell
            .Height = Unit.Pixel(_TextBoxLineHeight)
            .ID = "framecell"
        End With
        txtRow.Cells.Add(txtCell)

        'Правая ячейка
        Dim RightTxtCell As New TableCell()
        With RightTxtCell
            .Height = Unit.Pixel(_TextBoxLineHeight)
            .Width = Unit.Pixel(_LeftAndRightFrameWidth)
            .BackColor = _FrameColor
        End With
        txtRow.Cells.Add(RightTxtCell)

        'Нижняя строка

        Dim BotRow As New TableRow()
        IntContainerTable.Rows.Add(BotRow)

        'Левая ячейка
        Dim LeftBotFrameCell As New TableCell()
        With LeftBotFrameCell
            .Width = Unit.Pixel(10)
            .Height = Unit.Pixel(10)
            .BackColor = Me._FrameColor
        End With
        BotRow.Cells.Add(LeftBotFrameCell)


        'Средняя нижняя ячейка рамки
        Dim MiddleBotFrameCell As New TableCell()
        With MiddleBotFrameCell
            '.Width = Unit.Percentage(100)
            .Height = Unit.Pixel(_TopAndBotFrameHeight)
            .BackColor = Me._FrameColor
        End With
        BotRow.Cells.Add(MiddleBotFrameCell)

        'Нижняя правая ячейка
        Dim RightBotFrameCell As New TableCell()
        With RightBotFrameCell
            .Width = Unit.Pixel(10)
            .Height = Unit.Pixel(10)
            .BackColor = _FrameColor
        End With
        BotRow.Cells.Add(RightBotFrameCell)


        'Заполнение коллекции контролов
        Controls.Add(ContainerTable)
        ChildControlsCreated = True 'указывает, все-ли элементы управления созданы
    End Sub 'CreateControlHierarhy

    ''' <summary>
    ''' Записывает скрипт на страницу
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub WriteScriptToPage()
        If (Page.ClientScript.IsClientScriptBlockRegistered("__writeScript") = False) Then
            Dim js As String = generateTextAreaScript("sender")
            Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "__writeScript", js, True)
        End If
        If (Page.ClientScript.IsClientScriptBlockRegistered("setImage") = False) Then
            Dim js As String = generateSetImageScript()
            Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "setImage", js, True)
        End If
        If (Page.ClientScript.IsClientScriptBlockRegistered("setBold") = False) Then
            Dim js As String = generateBoldScript()
            Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "setBold", js, True)
        End If
        If (Page.ClientScript.IsClientScriptBlockRegistered("setItal") = False) Then
            Dim js As String = generateItalicScript()
            Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "setItal", js, True)
        End If
        If (Page.ClientScript.IsClientScriptBlockRegistered("setUnder") = False) Then
            Dim js As String = generateUnderlineScript()
            Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "setUnder", js, True)
        End If
    End Sub
    ''' <summary>
    ''' Генерирует скрипт для обработки события, сгенерированного объектом с именем sender
    ''' </summary>
    ''' <param name="senderName">Имя объекта, сгкенерировавшего событие</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Function generateTextAreaScript(ByVal senderName As String) As String
        Dim sb As New StringBuilder()
        With sb
            .AppendLine("function __writeScript() {")

            '.AppendLine("var newHTML =" & Chr(34) & "<iframe scrolling='no' frameborder='no' src='#' id='frameId' name='frameId'></iframe><br/>" & Chr(34))
            .AppendLine("var newHTML =" & Chr(34) & _
                        "<iframe scrolling='no' frameborder='no' src='#' id='frameId' name='frameId' width='100%' height='100%'></iframe><br/>" & Chr(34))

            .AppendLine("document.getElementById('RichTextBox1_framecell').innerHTML = newHTML")

            '7 последующих строк пришлось оставить для того, чтобы текстовая область (iFrame) , становилась активной
            'сразу после загрузки
            .AppendLine("var isGecko = navigator.userAgent.toLowerCase().indexOf('gecko') != -1;")

            .AppendLine("var iframe = (isGecko) ? document.getElementById('frameId') : frames['frameId'];")
            .AppendLine("var iWin = (isGecko) ? iframe.contentWindow : iframe.window;")
            .AppendLine("var iDoc = (isGecko) ? iframe.contentDocument : iframe.document;")
            'Строка ниже нужна для нормальной работы в Mozilla и Safari
            .AppendLine("iDoc.open(); iDoc.write(); iDoc.close();")
            .AppendLine("if (!iDoc.designMode) alert('Визуальный режим редактирования не поддерживается Вашим браузером');")
            .AppendLine("else iDoc.designMode = (isGecko) ? 'on' : 'On';")
            .AppendLine("iWin.focus();")
            .AppendLine("}")
        End With
        Return sb.ToString()
    End Function

    Protected Function generateSetImageScript() As String
        Dim sb As New StringBuilder()
        With sb
            .AppendLine("function setImage(url){")
            .AppendLine("var isGecko = navigator.userAgent.toLowerCase().indexOf('gecko') != -1;")
            .AppendLine("var iframe = (isGecko) ? document.getElementById('frameId') : frames['frameId'];")
            .AppendLine("var iWin = (isGecko) ? iframe.contentWindow : iframe.window;")
            .AppendLine("var iDoc = (isGecko) ? iframe.contentDocument : iframe.document;")
            .AppendLine("if (!iDoc.designMode) alert('Визуальный режим редактирования не поддерживается Вашим браузером');")
            .AppendLine("else iDoc.designMode = (isGecko) ? 'on' : 'On';")
            .AppendLine("iWin.focus();")
            .AppendLine("iWin.document.execCommand('InsertImage', null, url);")
            .AppendLine("}")
        End With

        Return sb.ToString()
    End Function

    Protected Function generateBoldScript() As String
        Dim sb As New StringBuilder()
        With sb
            .AppendLine("function setBold() {")
            .AppendLine("var isGecko = navigator.userAgent.toLowerCase().indexOf('gecko') != -1;")
            .AppendLine("var iframe = (isGecko) ? document.getElementById('frameId') : frames['frameId'];")
            .AppendLine("var iWin = (isGecko) ? iframe.contentWindow : iframe.window;")
            .AppendLine("var iDoc = (isGecko) ? iframe.contentDocument : iframe.document;")
            .AppendLine("if (!iDoc.designMode) alert('Визуальный режим редактирования не поддерживается Вашим браузером');")
            .AppendLine("else iDoc.designMode = (isGecko) ? 'on' : 'On';")
            .AppendLine("iWin.focus();")
            .AppendLine("iWin.document.execCommand('bold', null, '');")
            .AppendLine("}")
        End With
        Return sb.ToString()
    End Function

    Protected Function generateItalicScript() As String
        Dim sb As New StringBuilder()
        With sb
            .AppendLine("function setItal() {")
            .AppendLine("var isGecko = navigator.userAgent.toLowerCase().indexOf('gecko') != -1;")
            .AppendLine("var iframe = (isGecko) ? document.getElementById('frameId') : frames['frameId'];")
            .AppendLine("var iWin = (isGecko) ? iframe.contentWindow : iframe.window;")
            .AppendLine("var iDoc = (isGecko) ? iframe.contentDocument : iframe.document;")
            .AppendLine("if (!iDoc.designMode) alert('Визуальный режим редактирования не поддерживается Вашим браузером');")
            .AppendLine("else iDoc.designMode = (isGecko) ? 'on' : 'On';")
            .AppendLine("iWin.focus();")
            .AppendLine("iWin.document.execCommand('italic', null, '');")
            .AppendLine("}")
        End With
        Return sb.ToString()
    End Function

    Protected Function generateUnderlineScript() As String
        Dim sb As New StringBuilder()
        With sb
            .AppendLine("function setUnder() {")
            .AppendLine("var isGecko = navigator.userAgent.toLowerCase().indexOf('gecko') != -1;")
            .AppendLine("var iframe = (isGecko) ? document.getElementById('frameId') : frames['frameId'];")
            .AppendLine("var iWin = (isGecko) ? iframe.contentWindow : iframe.window;")
            .AppendLine("var iDoc = (isGecko) ? iframe.contentDocument : iframe.document;")
            .AppendLine("if (!iDoc.designMode) alert('Визуальный режим редактирования не поддерживается Вашим браузером');")
            .AppendLine("else iDoc.designMode = (isGecko) ? 'on' : 'On';")
            .AppendLine("iWin.focus();")
            .AppendLine("iWin.document.execCommand('underline', null, '');")
            .AppendLine("}")
        End With
        Return sb.ToString()
    End Function


#End Region 'Protected methods
#Region "Overrides Methods"
    ''' <summary>
    ''' Строит дерево дочерних элементов
    ''' </summary>
    ''' <remarks></remarks>
    Protected Overrides Sub CreateChildControls()
        Controls.Clear()
        CreateControlHierarhy()
        ClearChildViewState()
    End Sub 'CreateChildControls


    'Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter)
    '    MyBase.Render(output)
    '    With output
    '        .WriteBeginTag("input")
    '        .Write("type=")
    '        .Write(Chr(34) & "image" & Chr(34))
    '        .Write("src=")
    '        .Write(Chr(34) & "Images/FormatButtonImages/20_20/bold.gif" & Chr(34))
    '        .WriteEndTag("input")
    '    End With
    'End Sub



#End Region 'Overrides Methods

End Class 'RichTextBox
#End Region 'RichTextBox
#Region "RichTextBoxDesigner"
Namespace Design
    Public Class RichTextBoxDesigner
        Inherits System.Web.UI.Design.ControlDesigner
        Public Overrides Function GetDesignTimeHtml() As String
            Try
                Return MyBase.GetDesignTimeHtml
            Catch ex As Exception
                Return GetErrorDesignTimeHtml(ex)
            End Try
        End Function
        Protected Overrides Function GetEmptyDesignTimeHtml() As String
            Return Me.CreatePlaceHolderDesignTimeHtml("ASPTextBox.MyTextBox")
        End Function
        Protected Overrides Function GetErrorDesignTimeHtml(ByVal e As System.Exception) As String
            Return MyBase.GetErrorDesignTimeHtml(e)
        End Function
    End Class
End Namespace 'Design
#End Region 'RichTextBoxDesigner